package service;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import entity.Projeto;
import entity.Recurso;
import exception.AlmiranteException;


@Stateless
@LocalBean
public class RecursoService {
	@PersistenceContext(unitName = "almirante")
	private EntityManager em;
	
	@EJB
	private ProjetoService projetoService;
	
	
	/**
	 * Inclui um novo projeto.
	 * @param nome
	 * @param inicio
	 * @param fim
	 * @return Projeto
	 */
	public void incluirRecuso(Recurso recurso) {
		
		em.persist(recurso);
	}
	
	public void excluirRecuso(Recurso recurso) throws AlmiranteException {
			List<Projeto> listProjeto = projetoService.listarProjetosPorRecurso(recurso.getIdRecurso());
			if (listProjeto.size() == 0){
				recurso = em.find(Recurso.class,recurso.getIdRecurso());
				em.remove(recurso);
			}
			else{
				throw new AlmiranteException("Recurso já possui projetos vinculados");
			}
			
	}
	
	public void alterarRecurso(Recurso recurso){
		em.merge(recurso);
	}
	
	
	public Recurso obterRecursoPorLogin(String login){
		
		Query query = em.createNamedQuery("obterPorLogin");
		query.setParameter("login", login);
		
		return (Recurso)query.getSingleResult();
	}
	
	public List<Recurso> listarRecursosNaoVinculadosAIteracao(Long idIteracao) {
		String jpql = "SELECT r " +
				"FROM Recurso r, Iteracao i " +
				"WHERE r NOT MEMBER OF i.recursos " +
				"AND r MEMBER OF i.fase.projeto.recursos " +
				"AND i.id = :idIteracao";
		
		TypedQuery<Recurso> query = em.createQuery(jpql, Recurso.class);
		query.setParameter("idIteracao", idIteracao);
		
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Recurso> listarRecursosDaIteracao(Long idIteracao) {
		String jpql = "SELECT r " +
				"FROM Recurso r, Iteracao i " +
				"WHERE r MEMBER OF i.recursos " +
				"AND i.id = :idIteracao";
		
		Query query = em.createQuery(jpql, Recurso.class);
		query.setParameter("idIteracao", idIteracao);
		
		return query.getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Recurso> pesquisarRecurso(Recurso recurso){
		StringBuffer hql = new StringBuffer("FROM Recurso r WHERE ");
		//TODO tirar a gambiarra..
		if (recurso.getNomeRecurso() != null && !"".equals(recurso.getNomeRecurso())){
			hql.append("r.nomeRecurso like :nomeRecurso AND ");
		}
		 if(recurso.getCargo() != null && !"".equals(recurso.getCargo())){
			hql.append("r.cargo like :cargoRecurso AND ");
		}
			hql.append(" 1 = 1 ");
		
		Query query = em.createQuery(hql.toString());
		if (recurso.getNomeRecurso() != null  && !"".equals(recurso.getNomeRecurso())){
			query.setParameter("nomeRecurso", "%"+recurso.getNomeRecurso()+"%");
		}
		if (recurso.getCargo() != null && !"".equals(recurso.getCargo())){
		
			query.setParameter ("cargoRecurso","%"+ recurso.getCargo()+"%" );
		}
		
		System.out.println(hql.toString());
		
		return query.getResultList();
	}
	
	public Recurso obterRecursoPorId(Integer idRecurso) {
		return em.find(Recurso.class, idRecurso);
	}
	
	public List<Recurso> listarRecursosDoProjeto(Long idProjeto) {
		String jpql = "SELECT r " +
				"FROM Recurso r, Projeto p " +
				"WHERE r MEMBER OF p.recursos " +
				"AND p.id = :idProjeto";
		
		TypedQuery<Recurso> query = em.createQuery(jpql, Recurso.class);
		query.setParameter("idProjeto", idProjeto);
		
		return query.getResultList();
	}
	
	public List<Recurso> listarRecursosNaoVinculadosAoProjeto(Long idProjeto) {
		String jpql = "SELECT r " +
				"FROM Recurso r, Projeto p " +
				"WHERE r NOT MEMBER OF p.recursos " +
				"AND p.id = :idProjeto " +
				"AND p.gerenteProjetos <> r";
		
		TypedQuery<Recurso> query = em.createQuery(jpql, Recurso.class);
		query.setParameter("idProjeto", idProjeto);
		
		return query.getResultList();
	}
}
